package model;

import java.io.Serializable;
import java.util.List;

import dao.DAOFactory;
//import java.util.Date;
import dao.IContrachequeDAO;
import dao.IDependenteDAO;

public class Contracheque implements Serializable {
	
	private static final long serialVersionUID = 2748837857727564816L;

	private int id_contracheque;
	private String mes_referencia;
	private String ano_referencia;
	private int dias_trabalhados;
	private double salario;
	private double salario_familia;
	private double inss;
	private double fgts;
	private double irrf;
    private int pessoa_id_pessoa; 
    private int id_empresa;
    private String rg;
	private String cpf;
    private String nome_funcionario;
	private IContrachequeDAO daoContracheque = DAOFactory.getContrachequeDAO();    
	private IDependenteDAO daoDependente = DAOFactory.getDependenteDAO();
    
	
		
	public Contracheque(int id_contracheque, String mes_referencia, String ano_referencia, int dias_trabalhados,
						double salario, double salario_familia,double inss, double fgts, double irrf, int pessoa_id_pessoa,
						int id_empresa, String rg, String cpf, String nome_funcionario	){

		this.setId_contracheque(id_contracheque);
		this.setMes_referencia(mes_referencia);
		this.setAno_referencia(ano_referencia);
		this.setDias_trabalhados(dias_trabalhados);
		this.setSalario(salario);
		this.setSalario_familia(salario_familia);
		this.setInss(inss);
		this.setFgts(fgts);
		this.setIrrf(irrf);
		this.setPessoa_id_pessoa(pessoa_id_pessoa);
		this.setId_empresa(id_empresa);
		this.setRg(rg);
		this.setCpf(cpf);
		this.setNome_funcionario(nome_funcionario);
}

	public Contracheque(int id_contracheque, String mes_referencia, String ano_referencia, int dias_trabalhados,
			double salario, double salario_familia,double inss, double fgts, double irrf, int pessoa_id_pessoa,
			int id_empresa	){

		this.setId_contracheque(id_contracheque);
		this.setMes_referencia(mes_referencia);
		this.setAno_referencia(ano_referencia);
		this.setDias_trabalhados(dias_trabalhados);
		this.setSalario(salario);
		this.setSalario_familia(salario_familia);
		this.setInss(inss);
		this.setFgts(fgts);
		this.setIrrf(irrf);
		this.setPessoa_id_pessoa(pessoa_id_pessoa);
		this.setId_empresa(id_empresa);
}
	
	public Contracheque() {
		this.setId_contracheque(-1);
		this.setDias_trabalhados(30);
	}
	
	private static double calculateINSS(double salario){
		double maxINSS = 457.49;
		if(salario > 4159){
			return maxINSS;
		}
		else if (salario > 2079.50){
			return salario * 1.11;
		}
		else if (salario > 1247.70){
			return salario * 1.09;
		}
		else{
			return salario * 1.08;
		}
	}
	
	private static double calculateFGTS(double salario){
		return salario * 1.08;
	}
	
	private static double calculateIRRF(double salario, int dependentes){
		double descDespendente = 171.97;
		double totalDescDependentes = descDespendente * dependentes;
		double baseCalculo = salario - calculateINSS(salario) - totalDescDependentes;
		double parcelaDeducao = 0;
		double aliquotaImposto = 0;
		double resultado = 0;
		
		if(baseCalculo > 4271.59){
			parcelaDeducao = 790.58;
			aliquotaImposto = 27.5;
		}
		else if (salario > 3418.59){
			parcelaDeducao = 577;
			aliquotaImposto = 22.5;
		}
		else if (salario > 2563.91){
			parcelaDeducao = 320.60;
			aliquotaImposto = 15;
		}
		else if (salario > 1710.78){
			parcelaDeducao = 128.31;
			aliquotaImposto = 7.5;
		}
		resultado = (baseCalculo * (aliquotaImposto/100)) - parcelaDeducao;
		if (resultado < 0){
			return 0;
		}
		return resultado;
	}

	private static double calculateSalarioFamilia(double salario){
		if(salario < 646.55){
			return 33.16;
		}else if(salario < 971.78)
		{
			return 23.36;
		}else {
			return 0;
		}
	}
	
	public void gerarFolha(List<Pessoa> func, int id_empresa, String mes_referencia, String ano_referencia){
		for (Pessoa p : func) {
			Contracheque cl = new Contracheque();
			cl.setMes_referencia(mes_referencia);
			cl.setAno_referencia(ano_referencia);
			cl.setSalario(p.getSalario());
			cl.setSalario_familia(calculateSalarioFamilia(p.getSalario()));
			cl.setPessoa_id_pessoa(p.getId_pessoa());
			cl.setId_empresa(id_empresa);
			//INSS
			cl.setInss(calculateINSS(p.getSalario()));
			//FGTS
			cl.setFgts(calculateFGTS(p.getSalario()));
			//IRRF
			cl.setIrrf(calculateIRRF(p.getSalario(), daoDependente.getTotalDependentes(p.getId_pessoa())));
			daoContracheque.insertUpdate(cl);
		}
}

	public int getId_contracheque() {
		return id_contracheque;
	}





	public void setId_contracheque(int id_contracheque) {
		this.id_contracheque = id_contracheque;
	}





	public String getMes_referencia() {
		return mes_referencia;
	}





	public void setMes_referencia(String mes_referencia) {
		this.mes_referencia = mes_referencia;
	}





	public String getAno_referencia() {
		return ano_referencia;
	}





	public void setAno_referencia(String ano_referencia) {
		this.ano_referencia = ano_referencia;
	}





	public int getDias_trabalhados() {
		return dias_trabalhados;
	}





	public void setDias_trabalhados(int dias_trabalhados) {
		this.dias_trabalhados = dias_trabalhados;
	}





	public double getSalario() {
		return salario;
	}





	public void setSalario(double salario) {
		this.salario = salario;
	}





	public double getSalario_familia() {
		return salario_familia;
	}





	public void setSalario_familia(double salario_familia) {
		this.salario_familia = salario_familia;
	}





	public double getInss() {
		return inss;
	}





	public void setInss(double inss) {
		this.inss = inss;
	}





	public double getFgts() {
		return fgts;
	}





	public void setFgts(double fgts) {
		this.fgts = fgts;
	}





	public double getIrrf() {
		return irrf;
	}





	public void setIrrf(double irrf) {
		this.irrf = irrf;
	}





	public int getPessoa_id_pessoa() {
		return pessoa_id_pessoa;
	}





	public void setPessoa_id_pessoa(int pessoa_id_pessoa) {
		this.pessoa_id_pessoa = pessoa_id_pessoa;
	}





	public int getId_empresa() {
		return id_empresa;
	}





	public void setId_empresa(int id_empresa) {
		this.id_empresa = id_empresa;
	}





	public static long getSerialversionuid() {
		return serialVersionUID;
	}

    public String getRg() {
		return rg;
	}





	public void setRg(String rg) {
		this.rg = rg;
	}





	public String getCpf() {
		return cpf;
	}





	public void setCpf(String cpf) {
		this.cpf = cpf;
	}





	public String getNome_funcionario() {
		return nome_funcionario;
	}





	public void setNome_funcionario(String nome_funcionario) {
		this.nome_funcionario = nome_funcionario;
	}





	
}